﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using Waker.Entitys;
using Waker.Entitys;
using System.Threading;
using Waker.Common;

namespace Waker.APIs.IDCards
{
    public class IDCardHelper
    {
        #region 基础数据
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        public struct IDCardData
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string Name; //姓名   
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
            public string Sex;   //性别
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
            public string Nation; //名族
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
            public string Born; //出生日期
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 72)]
            public string Address; //住址
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
            public string IDCardNo; //身份证号
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string GrantDept; //发证机关
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
            public string UserLifeBegin; // 有效开始日期
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
            public string UserLifeEnd;  // 有效截止日期
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
            public string reserved; // 保留
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
            public string PhotoFileName; // 照片路径
        }
        /************************端口类API *************************/
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_SetMaxRFByte", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetMaxRFByte(int iPort, byte ucByte, int iIfOpen);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_GetCOMBaud", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetCOMBaud(int iPort, ref uint puiBaudRate);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_SetCOMBaud", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetCOMBaud(int iPort, uint uiCurrBaud, uint uiSetBaud);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_OpenPort", CharSet = CharSet.Ansi)]
        public static extern int Syn_OpenPort(int iPort);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_ClosePort", CharSet = CharSet.Ansi)]
        public static extern int Syn_ClosePort(int iPort);
        /**************************SAM类函数 **************************/
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_ResetSAM", CharSet = CharSet.Ansi)]
        public static extern int Syn_ResetSAM(int iPort, int iIfOpen);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMStatus", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetSAMStatus(int iPort, int iIfOpen);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMID", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetSAMID(int iPort, ref byte pucSAMID, int iIfOpen);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMIDToStr", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetSAMIDToStr(int iPort, ref byte pcSAMID, int iIfOpen);
        /*************************身份证卡类函数 ***************************/
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_StartFindIDCard", CharSet = CharSet.Ansi)]
        public static extern int Syn_StartFindIDCard(int iPort, ref byte pucIIN, int iIfOpen);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_SelectIDCard", CharSet = CharSet.Ansi)]
        public static extern int Syn_SelectIDCard(int iPort, ref byte pucSN, int iIfOpen);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsg", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadBaseMsg(int iPort, ref byte pucCHMsg, ref uint puiCHMsgLen, ref byte pucPHMsg, ref uint puiPHMsgLen, int iIfOpen);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDN", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadIINSNDN(int iPort, ref byte pucIINSNDN, int iIfOpen);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsgToFile", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadBaseMsgToFile(int iPort, ref byte pcCHMsgFileName, ref uint puiCHMsgFileLen, ref byte pcPHMsgFileName, ref uint puiPHMsgFileLen, int iIfOpen);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDNToASCII", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadIINSNDNToASCII(int iPort, ref byte pucIINSNDN, int iIfOpen);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_ReadNewAppMsg", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadNewAppMsg(int iPort, ref byte pucAppMsg, ref uint puiAppMsgLen, int iIfOpen);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_GetBmp", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetBmp(int iPort, ref byte Wlt_File);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_ReadMsg", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadMsg(int iPortID, int iIfOpen, ref IDCardData pIDCardData);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_FindReader", CharSet = CharSet.Ansi)]
        public static extern int Syn_FindReader();
        /***********************设置附加功能函数 ************************/
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoPath", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetPhotoPath(int iOption, ref byte cPhotoPath);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetPhotoType(int iType);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoName", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetPhotoName(int iType);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_SetSexType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetSexType(int iType);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_SetNationType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetNationType(int iType);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_SetBornType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetBornType(int iType);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeBType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetUserLifeBType(int iType);
        [DllImport(@"APIs\IDCards\SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeEType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetUserLifeEType(int iType, int iOption);
        #endregion

        public bool SearchReader(out string resMsg)
        {
            //int i;
            ////if (Session.IDCard_nPort > 0)
            ////{
            //byte[] pucIIN = new byte[4];
            //i = Syn_StartFindIDCard(Session.IDCard_nPort, ref pucIIN[0], 0);
            //if (i == 0)
            //{
            //    resMsg = "已连接";
            //    return true;
            //}
            //else
            //{
            //    Session.IDCard_nPort = -1;
            //    ThreadPool.QueueUserWorkItem((obj) =>
            //               {
            //                   i = Syn_FindReader();
            //                   if (i > 0)
            //                   {
            //                       Session.IDCard_nPort = i;
            //                       new INIHelper(Const_Base.IniConfigPath).Writue("IDCards", "nPort", i.ToString());
            //                   }
            //                   else
            //                   {
            //                       Session.IDCard_nPort = -1;
            //                       //resMsg = Convert.ToString(System.DateTime.Now) + "  没有找到读卡器";
            //                       //return false;
            //                   }

            //               });
            //    resMsg = "未连接";
            //    return false;
            //}
            //}
            int i;
            int nRet;
            uint[] iBaud = new uint[1];
            i = Syn_FindReader();
            if (i > 0)
            {
                Session.IDCard_nPort = i;
                new INIHelper(Consts.IniConfigPath).Writue("IDCards", "nPort", i.ToString());
                if (i > 1000)
                {
                    resMsg = Convert.ToString(i);
                    resMsg = Convert.ToString(System.DateTime.Now) + "  读卡器连接在USB " + resMsg;
                    return true;
                }
                else
                {
                    System.Threading.Thread.Sleep(200);
                    nRet = Syn_GetCOMBaud(i, ref iBaud[0]);
                    resMsg = Convert.ToString(i);
                    resMsg = Convert.ToString(System.DateTime.Now) + "  读卡器连接在COM " + resMsg + ";当前波特率为 " + Convert.ToString(iBaud[0]);
                    return true;
                }
            }
            else
            {
                Session.IDCard_nPort = -1;
                resMsg = Convert.ToString(System.DateTime.Now) + "  没有找到读卡器";
                return false;
            }
        }

        public En_Result<IDCardData> ReadIDCardIfo()
        {
            IDCardData CardData = new IDCardData();
            int nRet, nPort;
            string resMsg;
            byte[] pucIIN = new byte[4];
            byte[] pucSN = new byte[8];
            nPort = Convert.ToInt32(Session.IDCard_nPort);
            if (Syn_OpenPort(nPort) == 0)
            {
                if (Syn_SetMaxRFByte(nPort, 80, 0) == 0)
                {
                    nRet = Syn_StartFindIDCard(nPort, ref pucIIN[0], 0);
                    nRet = Syn_SelectIDCard(nPort, ref pucSN[0], 0);
                    nRet = Syn_ReadMsg(nPort, 0, ref CardData);
                    if (nRet == 0)
                    {
                        //stmp = Convert.ToString(System.DateTime.Now) + "  姓名:" + CardData.Name;
                        //listBox1.Items.Add(stmp);
                        //stmp = Convert.ToString(System.DateTime.Now) + "  性别:" + CardData.Sex;
                        //listBox1.Items.Add(stmp);
                        //stmp = Convert.ToString(System.DateTime.Now) + "  民族:" + CardData.Nation;
                        //listBox1.Items.Add(stmp);
                        //stmp = Convert.ToString(System.DateTime.Now) + "  出生日期:" + CardData.Born;
                        //listBox1.Items.Add(stmp);
                        //stmp = Convert.ToString(System.DateTime.Now) + "  地址:" + CardData.Address;
                        //listBox1.Items.Add(stmp);
                        //stmp = Convert.ToString(System.DateTime.Now) + "  身份证号:" + CardData.IDCardNo;
                        //listBox1.Items.Add(stmp);
                        //stmp = Convert.ToString(System.DateTime.Now) + "  发证机关:" + CardData.GrantDept;
                        //listBox1.Items.Add(stmp);
                        //stmp = Convert.ToString(System.DateTime.Now) + "  有效期开始:" + CardData.UserLifeBegin;
                        //listBox1.Items.Add(stmp);
                        //stmp = Convert.ToString(System.DateTime.Now) + "  有效期结束:" + CardData.UserLifeEnd;
                        //listBox1.Items.Add(stmp);
                        //stmp = Convert.ToString(System.DateTime.Now) + "  照片文件名:" + CardData.PhotoFileName;
                        //listBox1.Items.Add(stmp);

                        return En_Result<IDCardData>.CreateSuccessResult(CardData);
                    }
                    else
                    {
                        resMsg = Convert.ToString(System.DateTime.Now) + "  读取身份证信息错误";
                        return En_Result<IDCardData>.CreateFailedResult(resMsg);
                    }
                }
            }
            else
            {
                resMsg = Convert.ToString(System.DateTime.Now) + "  打开端口失败";
                return En_Result<IDCardData>.CreateFailedResult(resMsg);
            }
            return En_Result<IDCardData>.CreateFailedResult("系统错误");
        }

        public string ReadCardNo()
        {
            int nRet, nPort;
            byte[] pucIIN = new byte[4];
            byte[] pucSN = new byte[8];
            nPort = Convert.ToInt32(Session.IDCard_nPort);
            nRet = Syn_SelectIDCard(nPort, ref pucSN[0], 0);
            if (nRet == 0)
                return pucSN[0].ToString();
            return string.Empty;
        }
        public bool ClosePort()
        {
            return Syn_ClosePort(Session.IDCard_nPort) == 0;
        }
    }
}
